/*************************************************************************
 * File Name:    String_to_Integer.cc
 * Author:       zero91
 * Mail:         jianzhang9102@gmail.com
 * Created Time: 2013/11/6 22:23:23
 * 
 * Description:  
 |------------------------------------------------------------------------
 | Problem: String to Integer (atoi)
 |
 | Implement atoi to convert a string to an integer.
 |
 | Hint: Carefully consider all possible input cases. If you want a challenge, 
 | please do not see below and ask yourself what are the possible input cases.
 |
 | Notes: It is intended for this problem to be specified vaguely (ie, no
 | given input specs). You are responsible to gather all the input requirements up front.
 |
 | Requirements for atoi:
 | The function first discards as many whitespace characters as necessary until the
 | first non-whitespace character is found. Then, starting from this character, takes
 | an optional initial plus or minus sign followed by as many numerical digits as possible,
 | and interprets them as a numerical value.
 |
 | The string can contain additional characters after those that form the integral number,
 | which are ignored and have no effect on the behavior of this function.
 |
 | If the first sequence of non-whitespace characters in str is not a valid integral number,
 | or if no such sequence exists because either str is empty or it contains only whitespace
 | characters, no conversion is performed.
 |
 | If no valid conversion could be performed, a zero value is returned. If the correct value
 | is out of the range of representable values, INT_MAX (2147483647) or INT_MIN (-2147483648) is returned.
 |------------------------------------------------------------------------
 ************************************************************************/

#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <deque>
#include <map>
#include <set>
#include <functional>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>

using namespace std;

class Solution {
public:
    int atoi(const char *str)
    {
        long long ans = 0;
        bool negative = false;
        
        while (isspace(*str)) ++str;
        
        if (*str == '+') ++str;
        else if (*str == '-') {
            negative = true;
            ++str;
        }
        while (*str != '\0' && isdigit(*str)) {
            ans = ans * 10 + *str - '0';
            ++str;
        }
        if (negative) ans = -ans;
        
        if (ans > INT_MAX) return INT_MAX;
        else if (ans < INT_MIN) return INT_MIN;
        return ans;
    }
};
